/*** * curtains.js v6.2.2 * https://www.curtainsjs.com/ * * @author: Martin Laxenaire * https://www.martin-laxenaire.fr/ */ "use strict";function Curtains(t){(this.planes=[],this.renderTargets=[],this.shaderPasses=[],this._imageCache=[],this._drawStacks={opaque:{length:0,programs:[],order:[]},transparent:{length:0,programs:[],order:[]},renderPasses:[],scenePasses:[]},this._drawingEnabled=!0,this._forceRender=!1,this._autoResize=t.autoResize,null!==this._autoResize&&void 0!==this._autoResize||(this._autoResize=!0),this._autoRender=t.autoRender,null!==this._autoRender&&void 0!==this._autoRender||(this._autoRender=!0),this._watchScroll=t.watchScroll,null!==this._watchScroll&&void 0!==this._watchScroll||(this._watchScroll=!0),this.pixelRatio=t.pixelRatio||window.devicePixelRatio||1,t.renderingScale=isNaN(t.renderingScale)?1:parseFloat(t.renderingScale),this._renderingScale=Math.max(.25,Math.min(1,t.renderingScale)),this.premultipliedAlpha=t.premultipliedAlpha||!1,this.alpha=t.alpha,null!==this.alpha&&void 0!==this.alpha||(this.alpha=!0),this.antialias=t.antialias,null!==this.antialias&&void 0!==this.antialias||(this.antialias=!0),this.productionMode=t.production||!1,"string"==typeof t)&&(console.warn("Since v4.0 you should use an object to pass your container and other parameters. Please refer to the docs: https://www.curtainsjs.com/documentation.html"),t={container:t});t.container?this.setContainer(t.container):this.productionMode||console.warn("No container HTML element or ID provided. Use setContainer() method to set a container and initialize the WebGL context")}Curtains.prototype.setContainer=function(t){if(t){if("string"==typeof t){if(this.container=document.getElementById(t),!this.container)return void(this.productionMode||console.warn("No container HTML element or ID provided. WebGL context couldn't be created"))}else t instanceof Element&&(this.container=t);this._init()}else this.productionMode||console.warn("No container HTML element or ID provided. WebGL context couldn't be created")},Curtains.prototype._init=function(){this.glCanvas=document.createElement("canvas");var t={alpha:this.alpha,premultipliedAlpha:this.premultipliedAlpha,antialias:this.antialias};if(this.gl=this.glCanvas.getContext("webgl2",t),this._isWebGL2=!!this.gl,this.gl||(this.gl=this.glCanvas.getContext("webgl",t)||this.glCanvas.getContext("experimental-webgl",t)),!this.gl)return this.productionMode||console.warn("WebGL context could not be created"),void(this._onErrorCallback&&this._onErrorCallback());this._getExtensions(),this._glState={currentProgramID:null,programs:[],currentBuffersID:0,setDepth:null,frameBufferID:null,scenePassIndex:null,cullFace:null,flipY:null},this._contextLostHandler=this._contextLost.bind(this),this.glCanvas.addEventListener("webglcontextlost",this._contextLostHandler,!1),this._contextRestoredHandler=this._contextRestored.bind(this),this.glCanvas.addEventListener("webglcontextrestored",this._contextRestoredHandler,!1),this._scrollManager={handler:this._scroll.bind(this,!0),shouldWatch:this._watchScroll,xOffset:window.pageXOffset,yOffset:window.pageYOffset,lastXDelta:0,lastYDelta:0},this._watchScroll&&window.addEventListener("scroll",this._scrollManager.handler,{passive:!0}),this.setPixelRatio(this.pixelRatio,!1),this._resizeHandler=null,this._autoResize&&(this._resizeHandler=this.resize.bind(this,!0),window.addEventListener("resize",this._resizeHandler,!1)),this._readyToDraw()},Curtains.prototype._getExtensions=function(){this._extensions=[],this._isWebGL2?(this._extensions.EXT_color_buffer_float=this.gl.getExtension("EXT_color_buffer_float"),this._extensions.OES_texture_float_linear=this.gl.getExtension("OES_texture_float_linear"),this._extensions.WEBGL_lose_context=this.gl.getExtension("WEBGL_lose_context")):(this._extensions.OES_vertex_array_object=this.gl.getExtension("OES_vertex_array_object"),this._extensions.OES_texture_float=this.gl.getExtension("OES_texture_float"),this._extensions.OES_texture_float_linear=this.gl.getExtension("OES_texture_float_linear"),this._extensions.OES_texture_half_float=this.gl.getExtension("OES_texture_half_float"),this._extensions.OES_texture_half_float_linear=this.gl.getExtension("OES_texture_half_float_linear"),this._extensions.OES_element_index_uint=this.gl.getExtension("OES_element_index_uint"),this._extensions.OES_standard_derivatives=this.gl.getExtension("OES_standard_derivatives"),this._extensions.EXT_sRGB=this.gl.getExtension("EXT_sRGB"),this._extensions.WEBGL_depth_texture=this.gl.getExtension("WEBGL_depth_texture"),this._extensions.WEBGL_draw_buffers=this.gl.getExtension("WEBGL_draw_buffers"),this._extensions.WEBGL_lose_context=this.gl.getExtension("WEBGL_lose_context"))},Curtains.prototype.setPixelRatio=function(t,e){this.pixelRatio=parseFloat(Math.max(t,1))||1,this.resize(e)},Curtains.prototype._setSize=function(){var t=this.container.getBoundingClientRect();this._boundingRect={width:t.width*this.pixelRatio,height:t.height*this.pixelRatio,top:t.top*this.pixelRatio,left:t.left*this.pixelRatio};var e=!!navigator.userAgent.match(/Version\/[\d\.]+.*Safari/),i=/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream;if(e&&i){this._boundingRect.top=function(t){for(var e=0;t&&!isNaN(t.offsetTop);)e+=t.offsetTop-t.scrollTop,t=t.offsetParent;return e}(this.container)*this.pixelRatio}this.glCanvas.style.width=Math.floor(this._boundingRect.width/this.pixelRatio)+"px",this.glCanvas.style.height=Math.floor(this._boundingRect.height/this.pixelRatio)+"px",this.glCanvas.width=Math.floor(this._boundingRect.width*this._renderingScale),this.glCanvas.height=Math.floor(this._boundingRect.height*this._renderingScale),this.gl.viewport(0,0,this.gl.drawingBufferWidth,this.gl.drawingBufferHeight),this._scrollManager.shouldWatch&&(this._scrollManager.xOffset=window.pageXOffset,this._scrollManager.yOffset=window.pageYOffset)},Curtains.prototype.getBoundingRect=function(){return this._boundingRect},Curtains.prototype.resize=function(t){this._setSize();for(var e=0;e0;)this.removePlane(this.planes[0]);for(;this.shaderPasses.length>0;)this.removeShaderPass(this.shaderPasses[0]);for(;this.renderTargets.length>0;)this.removeRenderTarget(this.renderTargets[0]);for(var t=0;t0&&0===this._drawStacks.renderPasses.length&&(this._glState.scenePassIndex=0,this._bindFrameBuffer(this.shaderPasses[this._drawStacks.scenePasses[0]].target)),this._drawPlaneStack("opaque"),this._drawStacks.transparent.length&&(this.gl.clearDepth(1),this.gl.clear(this.gl.DEPTH_BUFFER_BIT),this._drawPlaneStack("transparent")),this._drawStacks.scenePasses.length>0&&this._drawStacks.renderPasses.length>0&&(this._glState.scenePassIndex=0,this._bindFrameBuffer(this.shaderPasses[this._drawStacks.scenePasses[0]].target));for(var t=0;t0)for(t=0;t-1;)s[0]+=i[0],s[1]+=i[1],s[2]+=i[2];return s}if(1===i.length)0===i[0]?(e[0]=s(e[1],this._curtains._applyMatrixToPoint([.95,1,0],this._matrices.mVPMatrix)),e.push(s(e[3],this._curtains._applyMatrixToPoint([-1,-.95,0],this._matrices.mVPMatrix)))):1===i[0]?(e[1]=s(e[0],this._curtains._applyMatrixToPoint([-.95,1,0],this._matrices.mVPMatrix)),e.push(s(e[2],this._curtains._applyMatrixToPoint([1,-.95,0],this._matrices.mVPMatrix)))):2===i[0]?(e[2]=s(e[3],this._curtains._applyMatrixToPoint([-.95,-1,0],this._matrices.mVPMatrix)),e.push(s(e[1],this._curtains._applyMatrixToPoint([1,.95,0],this._matrices.mVPMatrix)))):3===i[0]&&(e[3]=s(e[2],this._curtains._applyMatrixToPoint([.95,-1,0],this._matrices.mVPMatrix)),e.push(s(e[0],this._curtains._applyMatrixToPoint([-1,.95,0],this._matrices.mVPMatrix))));else if(2===i.length)0===i[0]&&1===i[1]?(e[0]=s(e[3],this._curtains._applyMatrixToPoint([-1,-.95,0],this._matrices.mVPMatrix)),e[1]=s(e[2],this._curtains._applyMatrixToPoint([1,-.95,0],this._matrices.mVPMatrix))):1===i[0]&&2===i[1]?(e[1]=s(e[0],this._curtains._applyMatrixToPoint([-.95,1,0],this._matrices.mVPMatrix)),e[2]=s(e[3],this._curtains._applyMatrixToPoint([-.95,-1,0],this._matrices.mVPMatrix))):2===i[0]&&3===i[1]?(e[2]=s(e[1],this._curtains._applyMatrixToPoint([1,.95,0],this._matrices.mVPMatrix)),e[3]=s(e[0],this._curtains._applyMatrixToPoint([-1,.95,0],this._matrices.mVPMatrix))):0===i[0]&&3===i[1]&&(e[0]=s(e[1],this._curtains._applyMatrixToPoint([.95,1,0],this._matrices.mVPMatrix)),e[3]=s(e[2],this._curtains._applyMatrixToPoint([.95,-1,0],this._matrices.mVPMatrix)));else if(3===i.length){for(var r=0,a=0;a1&&i.push(s)}i.length&&(e=this._getNearPlaneIntersections(t,e,i));var a=1/0,n=-1/0,o=1/0,h=-1/0;for(s=0;sn&&(n=u[0]),u[1]h&&(h=u[1])}return{top:h,right:n,bottom:o,left:a}},Curtains.BasePlane.prototype.getWebGLBoundingRect=function(){if(this._matrices.mVPMatrix){var t=this._getWorldCoords(),e={top:1-(t.top+1)/2,right:(t.right+1)/2,bottom:1-(t.bottom+1)/2,left:(t.left+1)/2};return e.width=e.right-e.left,e.height=e.bottom-e.top,{width:e.width*this._curtains._boundingRect.width,height:e.height*this._curtains._boundingRect.height,top:e.top*this._curtains._boundingRect.height+this._curtains._boundingRect.top,left:e.left*this._curtains._boundingRect.width+this._curtains._boundingRect.left,right:e.left*this._curtains._boundingRect.width+this._curtains._boundingRect.left+e.width*this._curtains._boundingRect.width,bottom:e.top*this._curtains._boundingRect.height+this._curtains._boundingRect.top+e.height*this._curtains._boundingRect.height}}return this._boundingRect.document},Curtains.BasePlane.prototype._getWebGLDrawRect=function(){var t=this.getWebGLBoundingRect();return{top:t.top-this.drawCheckMargins.top,right:t.right+this.drawCheckMargins.right,bottom:t.bottom+this.drawCheckMargins.bottom,left:t.left-this.drawCheckMargins.left}},Curtains.BasePlane.prototype.planeResize=function(){this._setDocumentSizes(),"Plane"===this._type&&(this.setPerspective(this._fov,this._nearPlane,this._farPlane),this._applyWorldPositions());for(var t=0;t=this._loadingManager.initSourcesToLoad){this._loadingManager.complete=!0,this._curtains.needRender();var t=this;setTimeout(function(){t._onReadyCallback&&t._onReadyCallback()},0)}},Curtains.BasePlane.prototype.loadSources=function(t){for(var e=0;e0)for(var i=0;i=e.HAVE_FUTURE_DATA&&i._onSourceLoaded(e),e.load(),this.videos.push(e)},Curtains.BasePlane.prototype.loadCanvas=function(t){var e=t;e.sampler=t.getAttribute("data-sampler")||null;var i=this.createTexture({sampler:e.sampler});this.canvases.push(e),i._onSourceLoaded(e)},Curtains.BasePlane.prototype.loadImages=function(t){for(var e=0;e0&&this.loadSources(t);var i=[];for(e=0;e0&&this.loadSources(i);var s=[];for(e=0;e0&&this.loadSources(s),this._loadingManager.initSourcesToLoad=t.length+i.length+s.length}0===this._loadingManager.initSourcesToLoad&&(this._isPlaneReady(),this._curtains.productionMode||console.warn("This plane does not contain any image, video or canvas element. You may want to add some later with the loadSource() or loadSources() method.")),this._canDraw=!0,this._curtains.needRender(),this.alwaysDraw||this._shouldDrawCheck()},Curtains.Plane.prototype._initMatrices=function(){var t=this._curtains.gl;this._matrices={mvMatrix:{name:"uMVMatrix",matrix:new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),location:t.getUniformLocation(this._usedProgram.program,"uMVMatrix")},pMatrix:{name:"uPMatrix",matrix:new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),location:t.getUniformLocation(this._usedProgram.program,"uPMatrix")}}},Curtains.Plane.prototype.resetPlane=function(t){this._initTransformValues(),null!==t&&t?(this.htmlElement=t,this.updatePosition()):t||this._curtains.productionMode||console.warn("You are trying to reset a plane with a HTML element that does not exist. The old HTML element will be kept instead.")},Curtains.Plane.prototype._setWorldSizes=function(){var t=this._curtains,e=this._boundingRect.document.width/2+this._boundingRect.document.left,i=this._boundingRect.document.height/2+this._boundingRect.document.top,s=t._boundingRect.width/2+t._boundingRect.left,r=t._boundingRect.height/2+t._boundingRect.top;this._boundingRect.world={width:this._boundingRect.document.width/t._boundingRect.width,height:this._boundingRect.document.height/t._boundingRect.height,top:(r-i)/t._boundingRect.height,left:(e-s)/t._boundingRect.height},this._boundingRect.world.scale={x:this._curtains._boundingRect.width/this._curtains._boundingRect.height*this._boundingRect.world.width/2,y:this._boundingRect.world.height/2}},Curtains.Plane.prototype._setPerspectiveMatrix=function(){if(this._updatePerspectiveMatrix){var t=this._curtains._boundingRect.width/this._curtains._boundingRect.height,e=this._nearPlane*Math.tan(Math.PI/180*.5*this._fov),i=2*e,s=t*i,r=-.5*s,a=r+s,n=e-i,o=2*this._nearPlane/(a-r),h=2*this._nearPlane/(e-n),u=(a+r)/(a-r),l=(e+n)/(e-n),_=-(this._farPlane+this._nearPlane)/(this._farPlane-this._nearPlane),c=-2*this._farPlane*this._nearPlane/(this._farPlane-this._nearPlane);this._matrices.pMatrix.matrix=new Float32Array([o,0,0,0,0,h,0,0,u,l,_,-1,0,0,c,0])}(this.shareProgram||!this.shareProgram&&this._updatePerspectiveMatrix)&&(this._curtains._useProgram(this._usedProgram),this._curtains.gl.uniformMatrix4fv(this._matrices.pMatrix.location,!1,this._matrices.pMatrix.matrix)),this._updatePerspectiveMatrix=!1},Curtains.Plane.prototype.setPerspective=function(t,e,i){var s=isNaN(t)?this._fov:parseFloat(t);(s=Math.max(1,Math.min(s,179)))!==this._fov&&(this._fov=s),this._cameraZPosition=2*Math.tan(Math.PI/180*.5*this._fov),this._CSSPerspective=Math.pow(Math.pow(this._curtains._boundingRect.width/(2*this._curtains.pixelRatio),2)+Math.pow(this._curtains._boundingRect.height/(2*this._curtains.pixelRatio),2),.5)/Math.tan(this._fov/2*Math.PI/180),this._nearPlane=isNaN(e)?this._nearPlane:parseFloat(e),this._nearPlane=Math.max(this._nearPlane,.01),this._farPlane=isNaN(i)?this._farPlane:parseFloat(i),this._farPlane=Math.max(this._farPlane,50),this._updatePerspectiveMatrix=!0,this._updateMVMatrix=!0},Curtains.Plane.prototype._setMVMatrix=function(){if(this._updateMVMatrix){this._translation.z=this.relativeTranslation.z/this._CSSPerspective;var t={x:this._translation.x,y:this._translation.y,z:-(1-this._translation.z)/this._cameraZPosition},e={x:2*this.transformOrigin.x-1,y:-(2*this.transformOrigin.y-1)},i={x:e.x*this._boundingRect.world.scale.x,y:e.y*this._boundingRect.world.scale.y,z:this.transformOrigin.z},s=this._curtains._composeMatrixFromOrigin(t,this.quaternion,this.scale,i),r=new Float32Array([this._boundingRect.world.scale.x,0,0,0,0,this._boundingRect.world.scale.y,0,0,0,0,1,0,0,0,0,1]);this._matrices.mvMatrix.matrix=this._curtains._multiplyMatrix(s,r),this._matrices.mVPMatrix=this._curtains._multiplyMatrix(this._matrices.pMatrix.matrix,this._matrices.mvMatrix.matrix),this.alwaysDraw||this._shouldDrawCheck()}(this.shareProgram||!this.shareProgram&&this._updateMVMatrix)&&(this._curtains._useProgram(this._usedProgram),this._curtains.gl.uniformMatrix4fv(this._matrices.mvMatrix.location,!1,this._matrices.mvMatrix.matrix)),this._updateMVMatrix=!1},Curtains.Plane.prototype.setScale=function(t,e){if(t=isNaN(t)?this.scale.x:parseFloat(t),e=isNaN(e)?this.scale.y:parseFloat(e),t=Math.max(t,.001),e=Math.max(e,.001),t!==this.scale.x||e!==this.scale.y){this.scale={x:t,y:e};for(var i=0;i=this._curtains._boundingRect.left+this._curtains._boundingRect.width||Math.round(t.bottom)<=this._curtains._boundingRect.top||Math.round(t.top)>=this._curtains._boundingRect.top+this._curtains._boundingRect.height?this._shouldDraw&&(this._shouldDraw=!1,setTimeout(function(){e._onLeaveViewCallback&&e._onLeaveViewCallback()},0)):(this._shouldDraw||setTimeout(function(){e._onReEnterViewCallback&&e._onReEnterViewCallback()},0),this._shouldDraw=!0)},Curtains.Plane.prototype.isDrawn=function(){return this._canDraw&&this.visible&&(this._shouldDraw||this.alwaysDraw)},Curtains.Plane.prototype._applyWorldPositions=function(){this._setWorldSizes(),this._setTranslation()},Curtains.Plane.prototype.updatePosition=function(){this._setDocumentSizes(),this._applyWorldPositions()},Curtains.Plane.prototype.updateScrollPosition=function(){(this._curtains._scrollManager.lastXDelta||this._curtains._scrollManager.lastYDelta)&&(this._boundingRect.document.top+=this._curtains._scrollManager.lastYDelta*this._curtains.pixelRatio,this._boundingRect.document.left+=this._curtains._scrollManager.lastXDelta*this._curtains.pixelRatio,this._applyWorldPositions())},Curtains.Plane.prototype.enableDepthTest=function(t){this._depthTest=t},Curtains.Plane.prototype.moveToFront=function(){this.enableDepthTest(!1);for(var t=this._transparent?"transparent":"opaque",e=this._curtains._drawStacks[t].programs["program-"+this._usedProgram.id],i=0;i0)this.textures[0]._canDraw=!1,this.textures[0]._init();else{var e=new Curtains.Texture(this._shaderPass?this._shaderPass:this,{index:this.textures.length,sampler:"uRenderTexture",isFBOTexture:!0});this.textures.push(e)}t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.textures[0]._sampler.texture,0)},Curtains.RenderTarget.prototype._createFrameBuffer=function(){var t=this._curtains.gl;this._frameBuffer=t.createFramebuffer(),this._curtains._bindFrameBuffer(this,!0),this._createFBOTexture(),this._depth&&(this._depthBuffer=t.createRenderbuffer(),this._bindDepthBuffer()),this._curtains._bindFrameBuffer(null)},Curtains.RenderTarget.prototype._restoreContext=function(){this._shaderPass&&this._shaderPass._isScenePass||(this._shaderPass=null,this._createFrameBuffer())},Curtains.RenderTarget.prototype._dispose=function(){this._frameBuffer&&(this._curtains.gl.deleteFramebuffer(this._frameBuffer),this._frameBuffer=null),this._depthBuffer&&(this._curtains.gl.deleteRenderbuffer(this._depthBuffer),this._depthBuffer=null),this.textures[0]._dispose(),this.textures=[]},Curtains.ShaderPass=function(t,e){e||(e={}),e.widthSegments=1,e.heightSegments=1,this._type="ShaderPass",this._isScenePass=!0,Curtains.BasePlane.call(this,t,t.container,e),this.index=this._curtains.shaderPasses.length,this._depth=e.depth||!1,this._shouldClear=e.clear,null!==this._shouldClear&&void 0!==this._shouldClear||(this._shouldClear=!0),this.target=e.renderTarget||null,this.target&&(this._isScenePass=!1,this._shouldClear=this.target._shouldClear),this._usedProgram&&this._initShaderPassPlane()},Curtains.ShaderPass.prototype=Object.create(Curtains.BasePlane.prototype),Curtains.ShaderPass.prototype.constructor=Curtains.ShaderPass,Curtains.ShaderPass.prototype._initShaderPassPlane=function(){if(this.target){this.setRenderTarget(this.target),this.target._shaderPass=this;var t=new Curtains.Texture(this,{index:this.textures.length,sampler:"uRenderTexture",isFBOTexture:!0,fromTexture:this.target.textures[0]});this.textures.push(t)}else this._createFrameBuffer();this._isPlaneReady(),this._canDraw=!0,this._curtains.needRender()},Curtains.ShaderPass.prototype._getDefaultVS=function(t){return"precision mediump float;\nattribute vec3 aVertexPosition;attribute vec2 aTextureCoord;varying vec3 vVertexPosition;varying vec2 vTextureCoord;void main() {vTextureCoord = aTextureCoord;vVertexPosition = aVertexPosition;gl_Position = vec4(aVertexPosition, 1.0);}"},Curtains.ShaderPass.prototype._getDefaultFS=function(t){return"precision mediump float;\nvarying vec3 vVertexPosition;varying vec2 vTextureCoord;uniform sampler2D uRenderTexture;void main( void ) {gl_FragColor = texture2D(uRenderTexture, vTextureCoord);}"},Curtains.ShaderPass.prototype._createFrameBuffer=function(){var t=new Curtains.RenderTarget(this._curtains,{shaderPass:this,clear:this._shouldClear,depth:this._depth});this.setRenderTarget(t),this.textures.push(this.target.textures[0])},Curtains.Texture=function(t,e){if(this._parent=t,this._curtains=t._curtains,this.uuid=this._curtains._generateUUID(),t._usedProgram||e.isFBOTexture)return this.index=t.textures.length,this._sampler={isActive:!1,name:e.sampler||"uSampler"+this.index},this._textureMatrix={name:e.sampler?e.sampler+"Matrix":"uTextureMatrix"+this.index,matrix:null},this._willUpdate=!1,this.shouldUpdate=!1,this._forceUpdate=!1,this.scale={x:1,y:1},this.userData={},this.type=e.isFBOTexture?"fboTexture":"empty",this._canDraw=!1,e.fromTexture?(this._initFromTexture=!0,this._parent._usedProgram&&this._setTextureUniforms(),void this.setFromTexture(e.fromTexture)):(this._initFromTexture=!1,this._init(),this);this._curtains.productionMode||console.warn("Unable to create the texture because the program is not valid")},Curtains.Texture.prototype._init=function(){var t=this._curtains.gl;if(this._sampler.texture=t.createTexture(),this._internalFormat=t.RGBA,this._format=t.RGBA,this._textureType=t.UNSIGNED_BYTE,this._texParameters=!1,this._flipY=!1,t.bindTexture(t.TEXTURE_2D,this._sampler.texture),this._curtains._glState.flipY&&(this._curtains._glState.flipY=this._flipY,t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,this._flipY)),t.pixelStorei(t.UNPACK_ALIGNMENT,4),t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),this._parent._usedProgram){if(this._size={width:this._parent._boundingRect.document.width,height:this._parent._boundingRect.document.height},this._setTextureUniforms(),"empty"===this.type)t.texImage2D(t.TEXTURE_2D,0,this._internalFormat,1,1,0,this._format,this._textureType,new Uint8Array([0,0,0,255])),this._sourceLoaded=!1;else if(!this.source){var e=this._getSizes();this._updateTextureMatrix(e)}}else this._size={width:this._parent._size.width||this._curtains._boundingRect.width,height:this._parent._size.height||this._curtains._boundingRect.height};"fboTexture"===this.type&&(this._curtains._isWebGL2&&this._curtains._extensions.EXT_color_buffer_float?(this._internalFormat=t.RGBA16F,this._textureType=t.HALF_FLOAT):this._curtains._extensions.OES_texture_half_float&&(this._textureType=this._curtains._extensions.OES_texture_half_float.HALF_FLOAT_OES),t.texImage2D(t.TEXTURE_2D,0,this._internalFormat,this._size.width,this._size.height,0,this._format,this._textureType,null),this._setMipmaps()),this._canDraw=!0},Curtains.Texture.prototype._setTextureUniforms=function(){for(var t=0;ta?h=Math.min(0,i-e*(1/a)):n=this.source.HAVE_CURRENT_DATA&&(this._willUpdate=!0),(this._forceUpdate||this._willUpdate&&this.shouldUpdate)&&this._update(),"video"===this.type&&(this._willUpdate=!1),this._forceUpdate=!1)},Curtains.Texture.prototype._restoreFromTexture=function(){this._initFromTexture?this._setTextureUniforms():this._init(),this.setFromTexture(this._originalTexture)},Curtains.Texture.prototype._restoreContext=function(){if(this._canDraw=!1,this._sampler.isActive=!1,this._originalTexture){var t=this;if(this._originalTexture._canDraw)setTimeout(function(){t._restoreFromTexture()},0);else var e=setInterval(function(){t._originalTexture._canDraw&&(t._restoreFromTexture(),clearInterval(e))},16)}else this._init(),this.source&&("image"===this.type&&this._curtains._imageCache.push(this),this.setSource(this.source),this.needUpdate())},Curtains.Texture.prototype._dispose=function(){"video"===this.type?(this.source.removeEventListener("canplaythrough",this._onSourceLoadedHandler,!1),this.source.removeEventListener("error",this._parent._sourceLoadError,!1),this.source.pause(),this.source.removeAttribute("src"),this.source.load(),this.source=null):"canvas"===this.type?(this.source.width=this.source.width,this.source=null):"image"===this.type&&this._curtains._isDestroying&&(this.source.removeEventListener("load",this._onSourceLoadedHandler,!1),this.source.removeEventListener("error",this._parent._sourceLoadError,!1),this.source=null);var t=this._curtains.gl;t&&!this._originalTexture&&("image"!==this.type||this._curtains._isDestroying)&&(t.activeTexture(t.TEXTURE0+this.index),t.bindTexture(t.TEXTURE_2D,null),t.deleteTexture(this._sampler.texture)),this._parent._loadingManager&&this._parent._loadingManager.sourcesLoaded--};